/* @flow */

import {
  isDef,
  isUndef
} from 'shared/util'

import {
  concat,
  stringifyClass,
  genClassForVnode
} from 'web/util/index'

function updateClass (oldVnode: any, vnode: any) {
  const el = vnode.elm
  const data: VNodeData = vnode.data
  const oldData: VNodeData = oldVnode.data
  if (
    //staticClass属性是通过class属性直接设置的，而不是通过:class动态绑定的形式
    isUndef(data.staticClass) &&
    isUndef(data.class) && (
      isUndef(oldData) || (
        isUndef(oldData.staticClass) &&
        isUndef(oldData.class)
      )
    )
  ) {
    return
  }

  //genClassForVnode方法用于解析vnode（及其祖先vnode和子孙vnode）的staticClass和动态class，
  //并将静态class和动态class拼接成一个字符串
  let cls = genClassForVnode(vnode)

  // handle transition classes
  //@todo _transitionClasses应该是跟动画相关的属性吧？
  const transitionClass = el._transitionClasses
  if (isDef(transitionClass)) {
    cls = concat(cls, stringifyClass(transitionClass))
  }

  // set the class
  //设置class属性，并做了性能优化，防止重复设置相同的class属性
  if (cls !== el._prevClass) {
    el.setAttribute('class', cls)
    el._prevClass = cls
  }
}

export default {
  create: updateClass,
  update: updateClass
}
